//package com.redis.demo.controller;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.UUID;
//import java.util.concurrent.TimeUnit;
//
///**
// * @author cici
// */
//@RestController
//public class GoodController6 {
//
//    final String REDIS_LOCK = "ciciLock";
//
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//
//    @Value("${server.port}")
//    private String serverPort;
//
//    @GetMapping(value = "/miaosha")
//    public String goods(){
//
//        String value = UUID.randomUUID().toString()+Thread.currentThread().getName();
//
//
//        try {
//
//            //加锁和设置时间没有原子性
////            Boolean flag = redisTemplate.opsForValue().setIfAbsent(REDIS_LOCK,value);
////            redisTemplate.expire(REDIS_LOCK,10L, TimeUnit.SECONDS);
//            Boolean flag = redisTemplate.opsForValue().setIfAbsent(REDIS_LOCK,value,10L,TimeUnit.SECONDS);
//            if (!flag) {
//                return "抢锁失败。";
//            }
//
//            String res = redisTemplate.opsForValue().get("goods:001");
//            int num = res == null ? 0 : Integer.parseInt(res);
//            if (num > 0){
//                int afterNum = num - 1 ;
//                redisTemplate.opsForValue().set("goods:001",String.valueOf(afterNum));
//                System.out.println("成功购买商品，库存还剩下：" + afterNum + "，端口来自" + serverPort);
//
//                return "成功购买商品，库存还剩下：" + afterNum + "，端口来自" + serverPort;
//            }else {
//                System.out.println("商品已售罄。" + serverPort);
//            }
//            return "商品已售罄。" + serverPort;
//        }finally {
//            //并发问题的时候要注意每段代码的原子性，判断和删锁不上原子操作，用LUA脚本可以解决
//            /**
//             * 问题是不用LUA脚本，还有其他方法吗？
//             */
//            if (redisTemplate.opsForValue().get(REDIS_LOCK).equalsIgnoreCase(value)){
//                redisTemplate.delete(REDIS_LOCK);
//            }
//        }
//    }
//}
